package Presentation;

import Metier.Controleurs.GestionCuisson;
import Metier.Objets.Produit;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import javax.swing.event.ListSelectionEvent;
import javax.swing.table.TableModel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.ResourceBundle;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListModel;

public class OngletCuisson extends Onglet {

    private JScrollPane scrollListePrincipale;
    private JScrollPane scrollTblGeneral;
    private JScrollPane scrollTblAlertes;
    private JList listePrincipale;

    private JPanel panelListe;
    private JPanel panelGeneral;
    private JPanel panelProduit;
    private JPanel panelCuisson;
    private JPanel panelLancerCuisson;
    private JPanel panelCuissonEnCours;
    private JPanel panelAlerte;

    private JTable tblGeneral;
    private JTable tableAlertes;

    private JLabel lblStock;
    private JLabel lblStockVal;
    private JLabel lblNomLot;
    private JLabel lblQuantite;

    private JTextField txtNomLot;
    private JTextField txtQuantite;

    private JButton btnLancerCuisson;

    private final GestionCuisson gCuisson;

    private ListeCuissonsObs listeCuissons;

    private TableCuissonsObs tableCuissonsModel;

    private final ListeTuilesCuissonObs listeTuilesCuisson;

    private HashMap<Produit, String> hashStock;

    private final OngletCuisson that;

    private final ResourceBundle cuissonBundle;

    /**
     * Creates new form OngletCuisson
     *
     * @param fp Fenêtre contenant l'onglet
     */
    public OngletCuisson(FenetrePrincipale fp) {
        super(fp);
        this.that = this;
        this.gCuisson = new GestionCuisson(this);
        this.tableCuissonsModel = new TableCuissonsObs(this);
        this.listeCuissons = new ListeCuissonsObs();
        this.listeTuilesCuisson = new ListeTuilesCuissonObs(this);
        this.hashStock = new HashMap<>();
        this.listeCuissons.addObserver(this.tableCuissonsModel);
        this.listeCuissons.addObserver(this.listeTuilesCuisson);
        this.cuissonBundle = ResourceBundle.getBundle("ressources/Cuisson/Cuisson", fp.getLocale());
        initComponents();
    }

    /**
     * Fonction d'initialisation des composants graphiques
     */
    private void initComponents() {
        /**
         * LINE_START
         */
        this.panelListe = new JPanel(new BorderLayout());
        this.listePrincipale = new JList(this.gCuisson.getContenuListPrincipale());
        this.listePrincipale.setSelectedIndex(0);
        this.listePrincipale.setFixedCellHeight(30);
        this.listePrincipale.setSelectedIndex(0);
        this.listePrincipale.addListSelectionListener((ListSelectionEvent e) -> {
            if (e.getValueIsAdjusting()) {
                if (((JList) e.getSource()).getSelectedValue() != null) {
                    switchPanel((Produit) ((JList) e.getSource()).getSelectedValue());
                }
            }
        });
        this.listePrincipale.setCellRenderer(new ListePrincipaleCuissonCellRender(this));
        this.scrollListePrincipale = new JScrollPane(this.listePrincipale);
        this.panelListe.add(this.scrollListePrincipale, BorderLayout.CENTER);
        this.add(this.panelListe, BorderLayout.LINE_START);

        /**
         * CENTER
         */
        this.panelGeneral = new JPanel(new CardLayout());

        // Panel tableau
        this.tblGeneral = new JTable();
        this.tblGeneral.setRowHeight(20);
        this.tblGeneral.setModel(this.tableCuissonsModel);
        this.tblGeneral.removeColumn(this.tblGeneral.getColumnModel().getColumn(5));
        this.scrollTblGeneral = new JScrollPane(this.tblGeneral);

        this.panelGeneral.add(this.scrollTblGeneral, "PANEL_TABLEAU");

        // Panel produit
        this.panelProduit = new JPanel(new BorderLayout());

        this.panelCuisson = new JPanel(new GridLayout(1, 2));
        this.panelLancerCuisson = new JPanel(new GridBagLayout());
        this.panelLancerCuisson.setBorder(BorderFactory.createTitledBorder(this.cuissonBundle.getString("cuisson.nouvelle")));
        this.lblStock = new JLabel(this.cuissonBundle.getString("cuisson.stockdispo") + " : ");
        this.lblStockVal = new JLabel();
        this.lblNomLot = new JLabel(this.cuissonBundle.getString("cuisson.nomlot") + " : ");
        this.txtNomLot = new JTextField(25);
        this.lblQuantite = new JLabel(this.cuissonBundle.getString("cuisson.quantite") + " : ");
        this.txtQuantite = new JTextField(3);
        this.btnLancerCuisson = new JButton(this.cuissonBundle.getString("cuisson.lancer"));
        this.btnLancerCuisson.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (!txtNomLot.getText().isEmpty() && !txtQuantite.getText().isEmpty()) {
                    try {
                        int nb = Integer.parseInt(txtQuantite.getText());
                        if (gCuisson.ajouterCuisson((Produit) listePrincipale.getSelectedValue(), txtNomLot.getText(), nb, lblStockVal) == null) {
                            JOptionPane.showMessageDialog(getFP(),
                                    cuissonBundle.getString("cuisson.stockinsuffisant"),
                                    cuissonBundle.getString("cuisson.erreur"),
                                    JOptionPane.ERROR_MESSAGE);
                        } else {
                            rafraichir();
                            txtNomLot.setText("");
                        }
                        txtQuantite.setText("");
                    } catch (NumberFormatException ex) {
                        JOptionPane.showMessageDialog(getFP(),
                                cuissonBundle.getString("cuisson.erreurentier"),
                                cuissonBundle.getString("cuisson.erreur"),
                                JOptionPane.ERROR_MESSAGE);
                        txtQuantite.setText("");
                    }
                }
            }
        });
        GridBagConstraints gbc = new GridBagConstraints(0, 0,
                1, 1,
                0, 0,
                GridBagConstraints.LINE_END,
                GridBagConstraints.NONE,
                new Insets(5, 0, 5, 0),
                0, 0
        );
        this.panelLancerCuisson.add(this.lblStock, gbc);
        gbc.gridy = 1;
        this.panelLancerCuisson.add(this.lblNomLot, gbc);
        gbc.gridy = 2;
        this.panelLancerCuisson.add(this.lblQuantite, gbc);
        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.anchor = GridBagConstraints.LINE_START;
        this.panelLancerCuisson.add(this.lblStockVal, gbc);
        gbc.gridy = 1;
        this.panelLancerCuisson.add(this.txtNomLot, gbc);
        gbc.gridy = 2;
        this.panelLancerCuisson.add(this.txtQuantite, gbc);
        gbc.gridx = 0;
        gbc.gridy = 3;
        gbc.gridwidth = 2;
        gbc.anchor = GridBagConstraints.CENTER;
        this.panelLancerCuisson.add(this.btnLancerCuisson, gbc);

        this.panelCuisson.add(this.panelLancerCuisson);

        this.panelCuissonEnCours = new JPanel(new GridLayout(0, 2));
        this.panelCuissonEnCours.setBorder(BorderFactory.createTitledBorder(cuissonBundle.getString("cuisson.encours")));
        this.panelCuisson.add(this.panelCuissonEnCours);

        this.panelProduit.add(this.panelCuisson, BorderLayout.CENTER);

        this.panelGeneral.add(this.panelProduit, "PANEL_PRODUIT");

        this.add(this.panelGeneral, BorderLayout.CENTER);

        /**
         * PAGE_END
         */
        this.panelAlerte = new JPanel(new BorderLayout());
        this.panelAlerte.setBorder(BorderFactory.createTitledBorder(cuissonBundle.getString("cuisson.seuilvitrine")));
        this.tableAlertes = new JTable(gCuisson.getAlertes(null));
        this.tableAlertes.setRowHeight(20);
        this.scrollTblAlertes = new JScrollPane(this.tableAlertes);
        this.scrollTblAlertes.setPreferredSize(new Dimension(this.scrollTblAlertes.getPreferredSize().width, 100));
        this.panelAlerte.add(this.scrollTblAlertes, BorderLayout.CENTER);
        this.add(this.panelAlerte, BorderLayout.PAGE_END);
        javax.swing.Timer timerAlertes = new javax.swing.Timer(20000, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                ThreadRafraichissementCuisson thread = new ThreadRafraichissementCuisson(that);
                thread.start();
            }
        });
        timerAlertes.start();

        // Remplir les composants
        this.rafraichir();
    }

    /**
     * Change de panel entre le tableau général et la vue d'un produit
     *
     * @param p Produit selectioné
     */
    public void switchPanel(Produit p) {
        CardLayout cl = (CardLayout) this.panelGeneral.getLayout();
        if (p.getNom().equals(cuissonBundle.getString("cuisson.general"))) {
            cl.show(this.panelGeneral, "PANEL_TABLEAU");
            this.rafraichir();
        } else {
            cl.show(this.panelGeneral, "PANEL_PRODUIT");
            this.lblStockVal.setText(this.hashStock.get(p));
            this.remplirTuiles(p);
        }
    }

    /**
     * Rafraichit la table
     */
    @Override
    public void rafraichir() {
        ThreadRafraichissementCuisson thread = new ThreadRafraichissementCuisson(that);
        thread.start();
    }

    @Override
    public void help() {
        String msg = cuissonBundle.getString("cuisson.aidemessage");
        JOptionPane.showMessageDialog(this.getFP(),
                msg,
                cuissonBundle.getString("cuisson.aide"),
                JOptionPane.INFORMATION_MESSAGE);
    }

    /**
     * Remplit le panel cuisson en cours
     * @param p Produit à récupérer
     */
    public void remplirTuiles(Produit p) {
        this.panelCuissonEnCours.removeAll();
        for (TuileCuisson t : this.listeTuilesCuisson.getListeTuilesCuisson()) {
            if (p.getNom().equals(t.getLotCuisson().getProduit().getNom())) {
                this.panelCuissonEnCours.add(t);
            }
        }
        this.panelCuissonEnCours.revalidate();
        this.panelCuissonEnCours.repaint();
    }

    public void setAlertes(TableModel tm) {
        this.tableAlertes.setModel(tm);
    }

    public void setListProduit(ListModel lm) {
        int index = this.listePrincipale.getSelectedIndex();
        this.listePrincipale.setModel(lm);
        this.listePrincipale.setSelectedIndex(index);
    }

    public JTable getTableAlertes() {
        return tableAlertes;
    }

    public ListeCuissonsObs getListeCuissons() {
        return listeCuissons;
    }

    public void setListeCuissons(ListeCuissonsObs listeCuissons) {
        this.listeCuissons = listeCuissons;
    }

    public boolean isInAlerte(Produit p) {
        for (int i = 0; i < this.tableAlertes.getModel().getRowCount(); i++) {
            if (this.tableAlertes.getModel().getValueAt(i, 0).toString().equals(p.toString())) {
                return true;
            }
        }
        return false;
    }

    public boolean isCuissonReady(Produit p) {
        java.util.List<TuileCuisson> list = this.listeTuilesCuisson.getListeTuilesCuisson();
        for (int i = 0; i < list.size(); i++) {
            TuileCuisson tuile = list.get(i);
            if (tuile.getLotCuisson().getProduit().equals(p) && tuile.timeLeft() <= 0) {
                return true;
            }
        }
        return false;
    }

    public boolean isCuissonPending(Produit p) {
        java.util.List<TuileCuisson> list = this.listeTuilesCuisson.getListeTuilesCuisson();
        for (int i = 0; i < list.size(); i++) {
            TuileCuisson tuile = list.get(i);
            if (tuile.getLotCuisson().getProduit().equals(p) && tuile.timeLeft() > 0) {
                return true;
            }
        }
        return false;
    }

    public HashMap<Produit, String> getHashStock() {
        return hashStock;
    }

    public void setHashStock(HashMap<Produit, String> hashStock) {
        this.hashStock = hashStock;
    }

    public JList getListePrincipale() {
        return listePrincipale;
    }

    public void setListePrincipale(JList listePrincipale) {
        this.listePrincipale = listePrincipale;
    }

    public TableCuissonsObs getTableCuissonsModel() {
        return tableCuissonsModel;
    }

    public void setTableCuissonsModel(TableCuissonsObs tableCuissonsModel) {
        this.tableCuissonsModel = tableCuissonsModel;
    }

    public JTable getTblGeneral() {
        return tblGeneral;
    }

    public void setTblGeneral(JTable tblGeneral) {
        this.tblGeneral = tblGeneral;
    }
}
